package ar.edu.utn.frsf.tpae.a2012.g05.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Restrictions;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.ClienteDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cliente;

public class ClienteDaoImpl implements ClienteDao{

	private SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
	
	public Cliente saveOrUpdate(Cliente cliente) {
		System.out.println("Ingresando al m�todos saveOrUpdate con " + cliente);
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.saveOrUpdate(cliente);
	    session.getTransaction().commit();
	    session.close();
	    System.out.println("Retornando del metodo saveOrUpdate");
	    return cliente;
	}

	public void delete(Cliente cliente) {
		System.out.println("Ingresando al m�todos delete con " + cliente);
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.delete(cliente);
	    session.getTransaction().commit();
	    session.close();
	    System.out.println("Retornando del metodo delete");
	}

	@SuppressWarnings("rawtypes")
	public Cliente findById(Long id) {
		Cliente cliente;
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    Criteria criterio = session.createCriteria(Cliente.class);
	    criterio.add(Restrictions.eq("cli_id", id));
	    // TODO: despues de agregar la dependencia de spring usar
//	    getHibernateTemplate().findByCriteria(criteria);
	    
	    List clientes = criterio.list();
	    if(clientes==null || clientes.isEmpty()) {
	    	cliente = null;
	    }
	    else {
	    	cliente = (Cliente)clientes.get(0);
	    }
	    session.getTransaction().commit();
	    session.close();
	    return cliente;
	}

	public Cliente findByNumber(String number) {
		System.out.println("Ingresando al metodo findByNumber con el numero " + number);
//		Cliente cliente;
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    Criteria criterio = session.createCriteria(Cliente.class);
	    criterio.add(Restrictions.eq("cli_nro", number));
	    // TODO: despues de agregar la dependencia de spring usar
//	    getHibernateTemplate().findByCriteria(criteria);
	    
//	    List clientes = criterio.list();
//	    if(clientes==null || clientes.isEmpty()) {
//	    	cliente = null;
//	    }
//	    else {
//	    	cliente = (Cliente)clientes.get(0);
//	    }
	    
	    Query query = session.createQuery("from " + Cliente.class.getName()
	            + " where cli_nro = :numero");
	    query.setString("numero", number);
	    Cliente cliente =  (Cliente) query.uniqueResult();
	    
	    session.getTransaction().commit();
	    session.close();
	    System.out.println("Retornando del metodo findByNumber con " + cliente);
	    return cliente;	}

	public List<Cliente> findAll() {
		// TODO Auto-generated method stub
		return null;
	}

}
